#ifndef TESTEXECUTION_H
#define TESTEXECUTION_H

#include <QObject>
#include <QTimer>
#include <QMap>
#include <QByteArray>
#include "datamodel.h"
#include "udpcommunicator.h"
#include "trdpcommunicator.h"

// 仅使用数据模型的结构体，删除枚举相关using（因type已改为QString）
using TestDataModel::ConfigItem;
using TestDataModel::TestDataItem;
using TestDataModel::TestGroup;
using TestDataModel::TestCase;
using TestDataModel::TestResultRecord;

enum class CommunicationProtocol {
    UDP,    // 代表 UDP 协议
    TRDP    // 代表 TRDP 协议
};

class TestExecution : public QObject {
    Q_OBJECT

public:
    explicit TestExecution(QObject *parent = nullptr);

    void executeTestCase(const TestDataModel::TestCase& testCase, int caseIndex = -1, QString ownIP="", QString dstIP="");
    void stopExecution();
    void exportTestResultsToCsv(const QString& filePath);

    void setCurrentTestCase(const TestCase& testCase) {
        m_currentTestCase = testCase;
        m_currentGroupIndex = 0;
    }

    // 设置通信协议
    void setProtocol(CommunicationProtocol protocol) { m_protocol = protocol; }

    // 配置TRDP通信
    void configureTrdp(const QString& ownIp, const QString& remoteIp,
                       const std::map<UINT32, UINT32>& publishers,
                       const std::vector<UINT32>& subscribers);

    // 配置UDP通信
    void configureUdp(const QString& sendIp, int sendPort,
                      const QString& receiveIp, int receivePort);

signals:
    // 单个测试步骤完成（可选保留，用于中间结果）
    void testCompleted(int caseIndex, const QString& result);
    // 测试过程中的实时进度（如发送次数、接收状态）
    void testProgress(int caseIndex, const QString& status);
    // 整个测试案例完成后的最终结果
    void testCaseFinished(int caseIndex, const QString& totalResult);

private slots:
    void onSendTimerTimeout();
    void onDataReceived(const QByteArray& data, int port);
    void onExecutionTimeout();
    void onTrdpDataReceived(const QByteArray& data, UINT32 comId);  // TRDP数据接收

private:
    CommunicationProtocol m_protocol = CommunicationProtocol::UDP;  // 默认使用UDP
    UdpCommunicator m_udp;
    TrdpCommunicator m_trdp;

    QTimer m_sendTimer;
    QTimer m_executionTimer;
    TestCase m_currentTestCase;
    int m_currentGroupIndex = 0;
    int m_currentCaseIndex = -1;  // 新增：当前测试案例索引
    QMap<QString, QVariant> m_receivedData;  // 临时存储接收的数据
    int m_sendCount;
    QList<TestResultRecord> m_testResultRecords;

    // 辅助函数（已适配QString类型的type）
    QMap<quint16, QByteArray> prepareUdpData(const QList<TestDataModel::TestDataItem>& inputData);
    QMap<UINT32, QByteArray> prepareTrdpData(const QList<TestDataModel::TestDataItem>& inputData);
    void sendUdpData(const QMap<quint16, QByteArray>& udpDataMap);
    void sendTrdpData(const QMap<UINT32, QByteArray>& trdpDataMap);
    QMap<QString, QString> receiveAndParseData(const QList<TestDataModel::TestDataItem>& expectedData);
    QString compareResults(const QList<TestDataModel::TestDataItem>& expectedData, const QMap<QString, QString>& actualData);
    void recordGroupTestResult(const QString& caseName, int groupNum,
                               const QList<TestDataItem>& inputList,
                               const QList<TestDataItem>& expectedList,
                               const QMap<QString, QString>& receivedData,
                               bool isPass);
    // 新增：解析接收数据的函数（之前遗漏声明）
    void parseReceivedData(const QByteArray& data, quint32 portOrCommid, const QList<TestDataItem>& expectedItems, bool isTrdp = false);
};

#endif // TESTEXECUTION_H
